/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.bc;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.cip.esymons.general.be.Solicitante;
import org.cip.esymons.general.util.Utiles;
import org.cip.esymons.tesoreria.be.EnumEstadoMovimiento;
import org.cip.esymons.tesoreria.be.EnumTipoDeuda;
import org.cip.esymons.tesoreria.be.MovimientoCuenta;
import org.cip.esymons.tesoreria.be.MovimientoFraccionamiento;

/**
 *
 * @author Gilmar Montoya
 */
public class FraccionamientoLima extends DecoradorFraccionamiento {

    private int cuotas = 0;
    private EntityManager em;

    @Override
    public Double generarInicial() {
        if (fraccionamientoBean != null) {
            return fraccionamientoBean.generarInicial();
        }
        return 0D;
    }

    @Override
    public List<MovimientoCuenta> listaMovimientosCuotas(List<MovimientoCuenta> listaMovimientos, Solicitante solicitante) {
        double descuento = 0, deuda = 0, cuota = 0, deudaTotal = 0.0;
        List<MovimientoCuenta> lista = new ArrayList<MovimientoCuenta>();
        descuento = obtenerDescuento();
        for (MovimientoCuenta mc : listaMovimientos) {
            deudaTotal += mc.getMcuSaldo();
            if (mc.getFkCinCodigo().isAfectoDescuentoPagoAnual()) {
                deuda += mc.getMcuSaldo();
            }
        }
        deuda = Utiles.redondearDouble((1 - descuento) * deuda, 2);
        cuota = Utiles.redondearDouble((deuda / cuotas), 2);
        deudaTotal = Utiles.redondearDouble((deudaTotal / cuotas), 2);
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        cal.add(Calendar.MONTH, -1);
        for (int i = 1; i <= cuotas; i++) {
            cal.add(Calendar.MONTH, 1);
//            cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
//            if (cal.get(Calendar.DAY_OF_WEEK) == 0) {
//                cal.add(Calendar.DAY_OF_MONTH, -1);
//            }
            cal.set(Calendar.DAY_OF_MONTH, 1);
            MovimientoCuenta mc = new MovimientoCuenta();
            mc.setDescripcion("Cuota de Fraccionamiento");
            mc.setEstado(EnumEstadoMovimiento.Impaga);
            mc.setFkCinCodigo(null);
            mc.setFkSolCodigo(solicitante);
            mc.setMcuAnio(cal.get(Calendar.YEAR));
            mc.setMcuMes(cal.get(Calendar.MONTH) + 1);
            mc.setMcuFechvencimiento(cal.getTime());
            mc.setMcuMonto(cuota);
            mc.setMcuSaldo(cuota);
            mc.setTipoDeuda(EnumTipoDeuda.FRACCIONAMIENTO);
            lista.add(mc);
        }
        double deudaParcial = 0.0;
        List<MovimientoFraccionamiento> listaAux = new ArrayList<MovimientoFraccionamiento>();
        int contCuotas = 0;
        for (MovimientoCuenta mc : listaMovimientos) {
            deudaParcial += mc.getMcuSaldo();
            if (deudaParcial >= deudaTotal && contCuotas < cuotas - 1) {
                double porcentaje = 0.0;
                contCuotas++;
                MovimientoFraccionamiento mFraccionamiento = new MovimientoFraccionamiento();
                mFraccionamiento.setMovimientoCuenta(mc);
                if (deudaParcial > deudaTotal) {
                    porcentaje = Utiles.redondearDouble(((deudaParcial - deudaTotal) * 100) / mc.getMcuSaldo(), 2);
                    deudaParcial = deudaParcial - deudaTotal;
                } else {
                    porcentaje = 0.0;
                    deudaParcial = 0.0;
                }
                mFraccionamiento.setPorcentaje(100 - porcentaje);
                listaAux.add(mFraccionamiento);
                lista.get(contCuotas - 1).getListaMovimientosAPagar().addAll(listaAux);
                listaAux = new ArrayList<MovimientoFraccionamiento>();
                if (deudaParcial > 0.0) {
                    MovimientoFraccionamiento mFraccionamiento2 = new MovimientoFraccionamiento();
                    mFraccionamiento2.setMovimientoCuenta(mc);
                    mFraccionamiento2.setPorcentaje(porcentaje);
                    listaAux.add(mFraccionamiento2);
                }
            } else {
                MovimientoFraccionamiento mFraccionamiento = new MovimientoFraccionamiento();
                mFraccionamiento.setMovimientoCuenta(mc);
                mFraccionamiento.setPorcentaje(100.00);
                listaAux.add(mFraccionamiento);
            }
        }
        contCuotas++;
        if (lista.size() > contCuotas) {
            lista.get(contCuotas - 1).getListaMovimientosAPagar().addAll(listaAux);
        }
        listaAux = new ArrayList<MovimientoFraccionamiento>();
        return lista;
    }

    private double obtenerDescuento() {
        try {
            Double monto = 0.0;
            Query q = em.createNativeQuery("select min(tcl.`fcu_maxCuota`),tcl.`fcu_descuento` from tes_conf_fraccionamiento_lima tcl Where ?1 <=tcl.`fcu_maxCuota`").setParameter(1, cuotas);
            List lista = q.getResultList();
            if (lista.size() > 0) {
                for (Iterator i = lista.iterator(); i.hasNext();) {
                    Vector v = (Vector) i.next();
                    monto = ((BigDecimal) v.get(0)).doubleValue();
                    break;
                }
            }
            return monto;
        } catch (Exception ex) {
            return 0;
        }
    }

    /**
     * @return the cuotas
     */
    public int getCuotas() {
        return cuotas;
    }

    /**
     * @param cuotas the cuotas to set
     */
    public void setCuotas(int cuotas) {
        this.cuotas = cuotas;
    }

    /**
     * @return the em
     */
    public EntityManager getEm() {
        return em;
    }

    /**
     * @param em the em to set
     */
    public void setEm(EntityManager em) {
        this.em = em;
    }
}
